﻿/*********************************************************
 * 开发人员：小兵
 * 创建时间：2012-10-9 11:28:27
 * 描述说明：
 * 
 * 更改历史：
 * 
 * *******************************************************/
namespace Mozlite.Data
{
    using System;
    using System.Web;
    using System.Data;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using Mozlite.Data.Components;

    /// <summary>
    /// 数据库辅助方法接口。
    /// </summary>
    public interface ISqlHelper
    {
        #region properties
        /// <summary>
        /// 获取连接字符串。
        /// </summary>
        string ConnectionString { get; }

        /// <summary>
        /// 获取安装工厂实例对象。
        /// </summary>
        IInstallerFactory Installer { get; }
        #endregion

        #region instances
        /// <summary>
        /// 启动事务处理对象实例。
        /// </summary>
        /// <return>当前事务处理实例对象。</return>
        IDbTransaction BeginTransaction();

        /// <summary>
        /// 创建参数。
        /// </summary>
        /// <param name="parameterName">参数名称。</param>
        /// <param name="value">参数值。</param>
        /// <returns>返回参数实例。</returns>
        IParameter CreateParameter(string parameterName, object value);
        #endregion

        #region common
        /// <summary>
        /// 执行命令语句，并返回影响行数。
        /// </summary>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回影响的行数。</returns>
        int ExecuteNonQuery(string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回<see cref="T:System.Data.IDataReader"/>实例对象。
        /// </summary>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回<see cref="T:System.Data.IDataReader"/>实例对象。</returns>
        IDataReader ExecuteReader(string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回结果实例对象。
        /// </summary>
        /// <typeparam name="T">返回结果类型。</typeparam>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回结果实例对象。</returns>
        T ExecuteScalar<T>(string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回<see cref="T:System.Xml.XmlReader"/>实例对象。
        /// </summary>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回<see cref="T:System.Xml.XmlReader"/>实例对象。</returns>
        XmlReader ExecuteXmlReader(string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回影响行数。
        /// </summary>
        /// <param name="commandType">命令类型。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回影响的行数。</returns>
        int ExecuteNonQuery(CommandType commandType, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回<see cref="T:System.Data.IDataReader"/>实例对象。
        /// </summary>
        /// <param name="commandType">命令类型。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回<see cref="T:System.Data.IDataReader"/>实例对象。</returns>
        IDataReader ExecuteReader(CommandType commandType, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回结果实例对象。
        /// </summary>
        /// <typeparam name="T">返回结果类型。</typeparam>
        /// <param name="commandType">命令类型。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回结果实例对象。</returns>
        T ExecuteScalar<T>(CommandType commandType, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回<see cref="T:System.Xml.XmlReader"/>实例对象。
        /// </summary>
        /// <param name="commandType">命令类型。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回<see cref="T:System.Xml.XmlReader"/>实例对象。</returns>
        XmlReader ExecuteXmlReader(CommandType commandType, string commandText, params IParameter[] parameters);
        #endregion

        #region transactions
        /// <summary>
        /// 执行命令语句，并返回影响行数。
        /// </summary>
        /// <param name="transaction">事务处理实例对象。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回影响的行数。</returns>
        int ExecuteNonQuery(IDbTransaction transaction, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回<see cref="T:System.Data.IDataReader"/>实例对象。
        /// </summary>
        /// <param name="transaction">事务处理实例对象。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回<see cref="T:System.Data.IDataReader"/>实例对象。</returns>
        IDataReader ExecuteReader(IDbTransaction transaction, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回结果实例对象。
        /// </summary>
        /// <typeparam name="T">返回结果类型。</typeparam>
        /// <param name="transaction">事务处理实例对象。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回结果实例对象。</returns>
        T ExecuteScalar<T>(IDbTransaction transaction, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回<see cref="T:System.Xml.XmlReader"/>实例对象。
        /// </summary>
        /// <param name="transaction">事务处理实例对象。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回<see cref="T:System.Xml.XmlReader"/>实例对象。</returns>
        XmlReader ExecuteXmlReader(IDbTransaction transaction, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回影响行数。
        /// </summary>
        /// <param name="transaction">事务处理实例对象。</param>
        /// <param name="commandType">命令类型。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回影响的行数。</returns>
        int ExecuteNonQuery(IDbTransaction transaction, CommandType commandType, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回<see cref="T:System.Data.IDataReader"/>实例对象。
        /// </summary>
        /// <param name="transaction">事务处理实例对象。</param>
        /// <param name="commandType">命令类型。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回<see cref="T:System.Data.IDataReader"/>实例对象。</returns>
        IDataReader ExecuteReader(IDbTransaction transaction, CommandType commandType, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回结果实例对象。
        /// </summary>
        /// <typeparam name="T">返回结果类型。</typeparam>
        /// <param name="transaction">事务处理实例对象。</param>
        /// <param name="commandType">命令类型。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回结果实例对象。</returns>
        T ExecuteScalar<T>(IDbTransaction transaction, CommandType commandType, string commandText, params IParameter[] parameters);

        /// <summary>
        /// 执行命令语句，并返回<see cref="T:System.Xml.XmlReader"/>实例对象。
        /// </summary>
        /// <param name="transaction">事务处理实例对象。</param>
        /// <param name="commandType">命令类型。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="parameters">参数数组。</param>
        /// <returns>返回<see cref="T:System.Xml.XmlReader"/>实例对象。</returns>
        XmlReader ExecuteXmlReader(IDbTransaction transaction, CommandType commandType, string commandText, params IParameter[] parameters);
        #endregion

        #region pager
        /// <summary>
        /// 分页查询，并返回总数量。
        /// </summary>
        /// <param name="pageIndex">页码，从1开始。</param>
        /// <param name="pageSize">每页显示记录数。</param>
        /// <param name="commandText">SQL语句。</param>
        /// <param name="size">返回总记录数。</param>
        /// <param name="parameters">参数。</param>
        /// <returns>返回数据列表。</returns>
        List<T> Fetch<T>(int pageIndex, int pageSize, string commandText, out int size, params IParameter[] parameters) where T : class,new(); 
        #endregion
    }
}
